﻿namespace MicroCloud.Identity
{
    /// <summary>
    /// 业务契约接口：身份认证模块
    /// </summary>
    public interface IIdentityContract
    {
        #region "属性 - 用户信息业务"
        #region "获取 用户信息查询数据集"
        /// <summary>
        /// 获取 用户信息查询数据集
        /// </summary>
        IQueryable<User> Users { get; }
        #endregion

        #endregion

        #region "属性 - 角色信息业务"
        #region "获取 角色信息查询数据集"
        /// <summary>
        /// 获取 角色信息查询数据集
        /// </summary>
        IQueryable<Role> Roles { get; }
        #endregion

        #endregion

        #region "属性 - 组织机构信息业务"
        #region "获取 组织机构信息查询数据集"
        /// <summary>
        /// 获取 组织机构信息查询数据集
        /// </summary>
        IQueryable<Organization> Organizations { get; }
        #endregion

        #endregion

        #region "属性 - 用户角色信息业务"
        #region "获取 用户角色信息查询数据集"
        /// <summary>
        /// 获取 用户角色信息查询数据集
        /// </summary>
        IQueryable<UserRole> UserRoles { get; }
        #endregion

        #endregion
        #region "方法 - 用户角色信息业务"
        #region "检查用户角色信息信息是否存在"
        /// <summary>
        /// 检查用户角色信息信息是否存在
        /// </summary>
        /// <param name="predicate">检查谓语表达式</param>
        /// <param name="id">更新的用户角色信息编号</param>
        /// <returns>用户角色信息是否存在</returns>
        Task<bool> CheckUserRoleExists(Expression<Func<UserRole, bool>> predicate, long id = default);
        #endregion
        #region "更新用户角色信息"
        /// <summary>
        /// 更新用户角色信息
        /// </summary>
        /// <param name="dtos">用户角色信息集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> UpdateUserRoles(params UserRoleInputDto[] dtos);
        #endregion
        #region "删除用户角色信息"
        /// <summary>
        /// 删除用户角色信息
        /// </summary>
        /// <param name="ids">用户角色信息编号</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> DeleteUserRoles(params long[] ids);
        #endregion
        #region "设置用户的角色"
        /// <summary>
        /// 设置用户的角色
        /// </summary>
        /// <param name="userId">用户编号</param>
        /// <param name="roleIds">角色编号集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> SetUserRoles(long userId, params long[] roleIds);
        #endregion
        #region "设置角色的用户"
        /// <summary>
        /// 设置角色的用户
        /// </summary>
        /// <param name="roleId">角色编号</param>
        /// <param name="userIds">用户编号集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> SetRoleUsers(long roleId, params long[] userIds);
        #endregion

        #endregion

        #region "属性 - 用户组织机构信息业务"
        #region "获取 用户组织机构信息查询数据集"
        /// <summary>
        /// 获取 组织机构信息查询数据集
        /// </summary>
        IQueryable<UserOrganization> UserOrganizations { get; }
        #endregion

        #endregion
        #region "方法 - 用户组织机构信息业务"
        #region "检查用户组织机构信息信息是否存在"
        /// <summary>
        /// 检查用户组织机构信息信息是否存在
        /// </summary>
        /// <param name="predicate">检查谓语表达式</param>
        /// <param name="id">用户组织机构信息编号</param>
        /// <returns>用户组织机构信息是否存在</returns>
        Task<bool> CheckUserOrganizationExists(Expression<Func<UserOrganization, bool>> predicate, long id = default);
        #endregion
        #region "更新用户组织机构信息"
        /// <summary>
        /// 更新用户组织机构信息
        /// </summary>
        /// <param name="dtos">用户组织机构信息集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> UpdateUserOrganizations(params UserOrganizationInputDto[] dtos);
        #endregion
        #region "删除用户组织机构信息"
        /// <summary>
        /// 删除用户组织机构信息
        /// </summary>
        /// <param name="ids">用户组织机构信息编号</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> DeleteUserOrganizations(params long[] ids);
        #endregion
        #region "设置用户的组织机构"
        /// <summary>
        /// 设置用户的组织机构
        /// </summary>
        /// <param name="userId">用户编号</param>
        /// <param name="dtos">用户组织机构DTO集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> SetUserOrganizations(long userId, params UserOrganizationDto[] dtos);
        #endregion
        #region "设置组织机构的用户"
        /// <summary>
        /// 设置组织机构的用户
        /// </summary>
        /// <param name="organizationId">组织机构编号</param>
        /// <param name="dtos">组织机构用户DTO集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> SetOrganizationUsers(long organizationId, params OrganizationUserDto[] dtos);
        #endregion

        #endregion

        #region "属性 - 角色组织机构信息业务"
        #region "获取 角色组织机构信息查询数据集"
        /// <summary>
        /// 获取 角色组织机构信息查询数据集
        /// </summary>
        IQueryable<RoleOrganization> RoleOrganizations { get; }
        #endregion

        #endregion
        #region "方法 - 角色组织机构信息业务"
        #region "检查角色组织机构信息信息是否存在"
        /// <summary>
        /// 检查角色组织机构信息信息是否存在
        /// </summary>
        /// <param name="predicate">检查谓语表达式</param>
        /// <param name="id">角色组织机构信息编号</param>
        /// <returns>角色组织机构信息是否存在</returns>
        Task<bool> CheckRoleOrganizationExists(Expression<Func<RoleOrganization, bool>> predicate, long id = default);
        #endregion
        #region "更新角色组织机构信息"
        /// <summary>
        /// 更新角色组织机构信息
        /// </summary>
        /// <param name="dtos">角色组织机构信息集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> UpdateRoleOrganizations(params RoleOrganizationInputDto[] dtos);
        #endregion
        #region "删除角色组织机构信息"
        /// <summary>
        /// 删除角色组织机构信息
        /// </summary>
        /// <param name="ids">角色组织机构信息编号</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> DeleteRoleOrganizations(params long[] ids);
        #endregion
        #region "设置角色的组织机构"
        /// <summary>
        /// 设置角色的组织机构
        /// </summary>
        /// <param name="roleId">角色编号</param>
        /// <param name="dtos">角色组织机构DTO集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> SetRoleOrganizations(long roleId, params RoleOrganizationDto[] dtos);
        #endregion
        #region "设置组织机构的角色"
        /// <summary>
        /// 设置组织机构的角色
        /// </summary>
        /// <param name="organizationId">组织机构编号</param>
        /// <param name="dtos">组织机构角色DTO集合</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> SetOrganizationRoles(long organizationId, params OrganizationRoleDto[] dtos);
        #endregion

        #endregion

        #region "属性 - 用户登录信息业务"
        #region "获取 用户登录信息查询数据集"
        /// <summary>
        /// 获取 用户登录信息查询数据集
        /// </summary>
        IQueryable<UserLogin> UserLogins { get; }
        #endregion

        #endregion
        #region "方法 - 用户登录信息业务"
        #region "删除的第三方登录绑定"
        /// <summary>
        /// 删除的第三方登录绑定
        /// </summary>
        /// <param name="ids">第三方用户登录主键</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> DeleteUserLogins(params long[] ids);
        #endregion

        #endregion

        #region "属性 - 登录日志信息业务"
        #region "获取 登录日志信息查询数据集"
        /// <summary>
        /// 获取 登录日志信息查询数据集
        /// </summary>
        IQueryable<LoginLog> LoginLogs { get; }
        #endregion

        #endregion
        #region "方法 - 登录日志信息业务"
        #region "删除登录日志信息信息"
        /// <summary>
        /// 删除登录日志信息信息
        /// </summary>
        /// <param name="ids">要删除的登录日志信息编号</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> DeleteLoginLogs(params long[] ids);
        #endregion

        #endregion

        #region "方法 - 身份认证"
        #region "注册账号"
        /// <summary>
        /// 注册账号
        /// </summary>
        /// <param name="registerType">注册类型</param>
        /// <param name="dto">注册信息</param>
        /// <param name="emailConfirmed">电子邮箱确认</param>
        /// <param name="phoneConfirmed">手机确认</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult<User>> Register(UserRegisterType registerType, RegisterDto dto
            , bool emailConfirmed = false, bool phoneConfirmed = false);
        #endregion
        #region "使用账号登录"
        /// <summary>
        /// 使用账号登录
        /// </summary>
        /// <param name="dto">登录信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult<User>> Login(LoginDto dto);
        #endregion
        #region "使用手机登录"
        /// <summary>
        /// 使用手机登录
        /// </summary>
        /// <param name="dto">登录信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult<User>> PhoneLogin(LoginDto dto);
        #endregion
        #region "使用授权码登录"
        /// <summary>
        /// 使用授权码登录
        /// </summary>
        /// <param name="dto">登录信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult<User>> AuthorizationLogin(LoginDto dto);
        #endregion
        #region "创建第三方票证信息"
        /// <summary>
        /// 创建第三方票证信息
        /// </summary>
        /// <param name="dto">第三方身份获取TokenDTO</param>
        /// <returns></returns>
        Task<OperationResult<UserLoginInfoEx>> CreateTicketAsync(OAuth2TokenDto dto);
        #endregion
        #region "使用第三方用户信息进行OAuth2登录"
        /// <summary>
        /// 使用第三方用户信息进行OAuth2登录
        /// </summary>
        /// <param name="loginInfo">第三方用户信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> LoginOAuth2(UserLoginInfoEx loginInfo);
        #endregion
        #region "预设置第三方用户信息进行OAuth2绑定"
        /// <summary>
        /// 预设置第三方用户信息进行OAuth2绑定
        /// </summary>
        /// <param name="loginInfo">第三方用户信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> BindOAuth2Preset(UserLoginInfoEx loginInfo);
        #endregion
        #region "使用第三方用户信息进行OAuth2绑定"
        /// <summary>
        /// 使用第三方用户信息进行OAuth2绑定
        /// </summary>
        /// <param name="loginInfo">第三方用户信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> BindOAuth2(UserLoginInfoEx loginInfo);
        #endregion
        #region "登录并绑定现有账号"
        /// <summary>
        /// 登录并绑定现有账号
        /// </summary>
        /// <param name="loginInfoEx">第三方登录信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult<User>> LoginBind(UserLoginInfoEx loginInfoEx);
        #endregion
        #region "一键创建新用户并登录"
        /// <summary>
        /// 一键创建新用户并登录
        /// </summary>
        /// <param name="loginInfoEx">第三方登录信息</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult<User>> LoginOneKey(UserLoginInfoEx loginInfoEx);
        #endregion
        #region "验证登录"
        /// <summary>
        /// 验证登录
        /// </summary>
        /// <param name="dto">登录信息</param>
        /// <returns>JSON操作结果</returns>
        Task<OperationResult<User>> CheckLogin(LoginDto dto);
        #endregion
        #region "账号退出"
        /// <summary>
        /// 账号退出
        /// </summary>
        /// <param name="isToken">是否token认证</param>
        /// <returns>业务操作结果</returns>
        Task<OperationResult> Logout(bool isToken = true);
        #endregion

        #endregion

    }

}
